home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / pascal / tpl60n19.zip / TESTPRGS.ZIP / FUN1_TST.PAS < prev    next >
Pascal/Delphi Source File  |  1993-02-14  |  7KB  |  235 lines

  1. {$A+,B-,D+,E+,F-,I-,L-,N+,O-,R-,S-,V-}
  2. {$M 16384,0,655360}
  3.  
  4. PROGRAM Fun1_Test;
  5.  
  6. USES Math, Fun1_TP6;
  7.  
  8. VAR  RandomNr:   ARRAY [0..10760] OF REAL;
  9.      R, R2:      REAL;
  10.      X, Y,
  11.      MaxY:       EXTENDED;
  12.      I, J, L,
  13.      ErrCountY:  LONGINT;
  14.  
  15. CONST
  16.     {$IFDEF VER40}
  17.     Ver = '4.0';
  18.     {$ENDIF}
  19.     {$IFDEF VER50}
  20.     Ver = '5.0';
  21.     {$ENDIF}
  22.     {$IFDEF VER55}
  23.     Ver = '5.5';
  24.     {$ENDIF}
  25.     {$IFDEF VER60}
  26.     Ver = '6.0';
  27.     {$ENDIF}
  28.     {$IFDEF VER70}
  29.     Ver = '7.0';
  30.     {$ENDIF}
  31.  
  32.  
  33. BEGIN
  34.    WriteLn;
  35.    WriteLn ('Testing for errors in the basic arithmetic operations of TP '+Ver);
  36.    WriteLn;
  37.    WriteLn ('There should be no errors reported and relative error should be below');
  38.    WriteLn (PowerOfTwo (-40), ' for all functions that are tested. The test ');
  39.    WriteLn ('will take some time to complete, especially when using the emulator.');
  40.    WriteLn ('─────────────────────────────────────────────────────────────────────');
  41.    RandSeed := 12345;
  42.    FOR L := 0 TO 10760 DO BEGIN
  43.       RandomNr [L] := Exp (Random * 87);
  44.    END;
  45.    ErrCountY := 0;
  46.    MaxY := 0;
  47.    FOR L := 1 TO 10000000 DO BEGIN
  48.       X := RandomNr [L MOD 10739] + RandomNr [(L + 101) MOD 10753];
  49.       Y := Add_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  50.       R := X;
  51.       R2:= Y;
  52.       IF (X <> Y) THEN BEGIN
  53.          IF Abs ((Y-X) / X) > MaxY THEN
  54.             MaxY := Abs ((Y-X) / X);
  55.          IF (R <> R2) THEN
  56.             Inc (ErrCountY);
  57.          END;
  58.    END;
  59.    WriteLn ('errors in addition:');
  60.    WriteLn;
  61.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  62.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  63.    WriteLn;
  64.    WriteLn;
  65.    MaxY := 0;
  66.    ErrCountY := 0;
  67.    FOR L := 1 TO 10000000 DO BEGIN
  68.       X := RandomNr [L MOD 10739] - RandomNr [(L + 101) MOD 10753];
  69.       Y := Add_TP60 (RandomNr [L MOD 10739], -(RandomNr [(L + 101) MOD 10753]));
  70.       R := X;
  71.       R2:= Y;
  72.       IF (X <> Y) THEN BEGIN
  73.          IF Abs ((Y-X) / X) > MaxY THEN
  74.             MaxY := Abs ((Y-X) / X);
  75.          IF (R <> R2) THEN
  76.             Inc (ErrCountY);
  77.          END;
  78.    END;
  79.    WriteLn ('errors in subtraction: ');
  80.    WriteLn;
  81.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  82.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  83.    WriteLn;
  84.    WriteLn;
  85.  
  86.    FOR L := 0 TO 10760 DO BEGIN
  87.       RandomNr [L] := Exp (Random * 43) * (Random - 1);
  88.       IF RandomNr [L] = 0 THEN
  89.          RandomNr[L] := 0.1;
  90.    END;
  91.    MaxY := 0;
  92.    ErrCountY := 0;
  93.    FOR L := 1 TO 100 DO BEGIN
  94.       X := RandomNr [L MOD 10739] * RandomNr [(L + 101) MOD 10753];
  95.       Y := Mul_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  96.       R := X;
  97.       R2:= Y;
  98.       IF (X <> Y) THEN BEGIN
  99.          IF Abs ((Y-X) / X) > MaxY THEN
  100.             MaxY := Abs ((Y-X) / X);
  101.          IF (R <> R2) THEN
  102.             Inc (ErrCountY);
  103.          END;
  104.    END;
  105.    WriteLn ('errors in multiplication: ');
  106.    WriteLn;
  107.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  108.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  109.  
  110.    WriteLn;
  111.    WriteLn;
  112.    MaxY := 0;
  113.    ErrCountY := 0;
  114.    FOR L := 1 TO 10760 DO BEGIN
  115.       X := Sqr (RandomNr [L]);
  116.       Y := Sqr_TP60 (RandomNr [L]);
  117.       R := X;
  118.       R2:= Y;
  119.       IF (X <> Y) THEN BEGIN
  120.          IF Abs ((Y-X) / X) > MaxY THEN
  121.             MaxY := Abs ((Y-X) / X);
  122.          IF (R <> R2) THEN
  123.             Inc (ErrCountY);
  124.          END;
  125.    END;
  126.    WriteLn ('errors in squaring: ');
  127.    WriteLn;
  128.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  129.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  130.    WriteLn;
  131.    WriteLn;
  132.    MaxY := 0;
  133.    ErrCountY := 0;
  134.    FOR L := 1 TO 10000000 DO BEGIN
  135.       X := RandomNr [L MOD 10739] * Abs (Trunc (RandomNr [(L + 101) MOD 10753] / 8e13));
  136.       Y := Mul_TP60 (RandomNr [L MOD 10739], Abs (Trunc (RandomNr [(L + 101) MOD 10753]/8e13)));
  137.       R := X;
  138.       R2:= Y;
  139.       IF (X <> Y) THEN BEGIN
  140.          IF Abs ((Y-X) / X) > MaxY THEN begin
  141.             MaxY := Abs ((Y-X) / X);
  142.             end;
  143.          IF (R <> R2) THEN
  144.             Inc (ErrCountY);
  145.          END;
  146.    END;
  147.    WriteLn ('errors in SHORT-multiplication: ');
  148.    WriteLn;
  149.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  150.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  151.    WriteLn;
  152.    WriteLn;
  153.    MaxY := 0;
  154.    ErrCountY := 0;
  155.    FOR L := 1 TO 10760 DO BEGIN
  156.       X := Sqr (1.0*Trunc(RandomNr [L] / 8e13+1));
  157.       Y := Sqr_TP60 (Trunc(RandomNr [L] / 8e13+1));
  158.       R := X;
  159.       R2:= Y;
  160.       IF (X <> Y) and (X <> 0) THEN BEGIN
  161.          IF Abs ((Y-X) / X) > MaxY THEN
  162.             MaxY := Abs ((Y-X) / X);
  163.          IF (R <> R2) THEN
  164.             Inc (ErrCountY);
  165.          END;
  166.    END;
  167.    WriteLn ('errors in squaring (Short): ');
  168.    WriteLn;
  169.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  170.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  171.    WriteLn;
  172.    WriteLn;
  173.    MaxY := 0;
  174.    ErrCountY := 0;
  175.    FOR L := 1 TO 10000000 DO BEGIN
  176.       X := RandomNr [L MOD 10739] / RandomNr [(L + 101) MOD 10753];
  177.       Y := Div_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  178.       R := X;
  179.       R2:= Y;
  180.       IF (X <> Y) THEN BEGIN
  181.          IF Abs ((Y-X) / X) > MaxY THEN
  182.             MaxY := Abs ((Y-X) / X);
  183.          IF (R <> R2) THEN
  184.             Inc (ErrCountY);
  185.          END;
  186.    END;
  187.    WriteLn ('errors in division: ');
  188.    WriteLn;
  189.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 100000.0:5:4, '%    ');
  190.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  191.    WriteLn;
  192.    halt;
  193.    WriteLn;
  194.    MaxY := 0;
  195.    ErrCountY := 0;
  196.    FOR L := 1 TO 10760 DO BEGIN
  197.       X := Int (RandomNr [L]) + Frac (RandomNr [L]);
  198.       Y := Int_TP60 (RandomNr [L]) + Frac_TP60 (RandomNr [L]);
  199.       R := X;
  200.       R2:= Y;
  201.       IF (X <> Y) THEN BEGIN
  202.          IF Abs ((Y-X) / X) > MaxY THEN
  203.             MaxY := Abs ((Y-X) / X);
  204.          IF (R <> R2) THEN
  205.             Inc (ErrCountY);
  206.          END;
  207.    END;
  208.    WriteLn ('errors in Int / Frac: ');
  209.    WriteLn;
  210.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  211.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  212.    WriteLn;
  213.    WriteLn;
  214.    MaxY := 0;
  215.    ErrCountY := 0;
  216.    FOR L := 1 TO 10760 DO BEGIN
  217.       RandomNr [L] := RandomNr [L] /2.5e9;
  218.       X := Trunc (RandomNr [L]);
  219.       Y := Float_TP60 (Trunc_TP60 (RandomNr [L]));
  220.       R := X;
  221.       R2:= Y;
  222.       IF (X <> Y) THEN BEGIN
  223.          IF Abs ((Y-X) / X) > MaxY THEN
  224.             MaxY := Abs ((Y-X) / X);
  225.          IF (R <> R2) THEN
  226.             Inc (ErrCountY);
  227.          END;
  228.    END;
  229.    WriteLn ('errors in Trunc / Float: ');
  230.    WriteLn;
  231.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  232.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  233.    WriteLn;
  234. END.
  235.